package model.dominio;

import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.PostPersist;
import javax.persistence.PostUpdate;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import model.dao.DaoBase;

/**
 * 
 * @author Daniel
 * Classe responsável pelo controle dos objetos relacionados a Veículo.
 * Abaixo, mapeamento da classe utilizando Hibernate.
 */
@Entity
@Table(name = "veiculo")
public class Veiculo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private Integer codigo = 0;
    @Column(length = 8)
    private String placa;
    @Column(length = 100)
    private String marca;
    @Column(length = 100)
    private String modelo;
    @Column(length = 100)
    private String cor;
    @JoinColumn(name = "codigo_tipo", referencedColumnName = "codigo")
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    private TipoVeiculo tipo;
    @Column(length = 200)
    private String opcionais;
    @Column(length = 200)
    private String observacoes;
    @Temporal(TemporalType.TIMESTAMP)
    private Calendar data_ultima_alteracao;
    @JoinColumn(name = "codigo_usuario", referencedColumnName = "codigo")
    @ManyToOne(optional = true, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    private Usuario usuario;

    /**
     * Construtor básico de objetos da Classe.
     * Utilizado para...
     */
    public Veiculo() {
    }

    /**
     * @return placa
     */
    public String getPlaca() {
        return this.placa;
    }

    /**
     * @param obs 
     * Observações sobre o Veículo
     */
    public void setObservacoes(String obs) {
        this.observacoes = obs;
    }

    /**
     * @param cor 
     */
    public void setCor(String cor) {
        this.cor = cor;
    }

    /**
     * @param opcionais 
     */
    public void setOpcionais(String opcionais) {
        this.opcionais = opcionais;
    }

    /**
     * Construtor secundário de objetos da Classe. Exige:
     * @param placa
     * @param marca
     * @param modelo 
     * Informações obrigatórias e exigidas para criação de um novo Veículo no Banco de Dados.
     */
    public Veiculo(String placa, String marca, String modelo) {
        this.placa = placa;
        this.marca = marca;
        this.modelo = modelo;
    }

    /**
     * @return codigo
     */
    public Integer getCodigo() {
        return codigo;
    }

    /**
     * @return marca
     */
    public String getMarca() {
        return marca;
    }

    /**
     * @return modelo
     */
    public String getModelo() {
        return modelo;
    }

    /**
     * @return cor
     */
    public String getCor() {
        return cor;
    }

    /**
     * @return tipo
     */
    public TipoVeiculo getTipo() {
        return tipo;
    }

    /**
     * @return opcionais
     */
    public String getOpcionais() {
        return opcionais;
    }

    /**
     * @return observacoes
     */
    public String getObservacoes() {
        return observacoes;
    }

    /**
     * @param codigo
     */
    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    /**
     * @param t 
     * Tipo do Veículo
     */
    public void setTipo(TipoVeiculo t) {
        this.tipo = t;
    }

    /**
     * @param placa 
     */
    public void setPlaca(String placa) {
        this.placa = placa;
    }

    /**
     * @param modelo 
     */
    public void setModelo(String modelo) {
        this.modelo = modelo;
    }

    /**
     * @param marca 
     */
    public void setMarca(String marca) {
        this.marca = marca;
    }

    /**
     * @return the data_ultima_alteracao
     */
    public Calendar getData_ultima_alteracao() {
        return data_ultima_alteracao;
    }

    /**
     * @param data_ultima_alteracao
     * 
     */
    public void setData_ultima_alteracao(Calendar data_ultima_alteracao) {
        this.data_ultima_alteracao = data_ultima_alteracao;
    }

    /**
     * @return usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    
    @PostPersist
    public void gerarLogCad(){
        Logg logg=new Logg();
        logg.setCodigo_objeto(this.codigo);
        logg.setAcao(new AcaoSistema(11));
        logg.setData_hora(this.data_ultima_alteracao);
        logg.setUsuario(this.usuario);
        new DaoBase().salvar(logg);
    }
    @PostUpdate
    public void gerarLogAlt(){
        Logg logg=new Logg();
        logg.setCodigo_objeto(this.codigo);
        logg.setAcao(new AcaoSistema(12));
        logg.setData_hora(this.data_ultima_alteracao);
        logg.setUsuario(this.usuario);
        new DaoBase().salvar(logg);
    }
}